/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bodylimit.service;

import br.com.bodylimit.dao.AlunoDAO;
import br.com.bodylimit.dao.DAOFactory;
import br.com.bodylimit.model.Aluno;
import br.com.bodylimit.util.ConnectionFactory;
import java.sql.SQLException;
import br.com.bodylimit.util.Mensagem;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.util.List;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

/**
 *
 * @author Jõao Paulo
 */
public class AlunoService {

    Connection con;
    AlunoDAO dao;

    static final Logger logger = Logger.getLogger("br.com.bodylimit.service");

    static {
        logger.setLevel(Level.ALL);
        try {
            FileHandler fh = new FileHandler("logs" + File.separator + "AlunoService.log");
            fh.setFormatter(new SimpleFormatter());
            logger.addHandler(fh);
        } catch(IOException ex) {
            logger.severe("Nao foi possivel criar arquivo de log!");
            ex.printStackTrace();
        }
    }

    public AlunoService() {
        

    }


    /**
     * Adciona um aluno a base de dados
     * @param aluno aluno a ser adcionado
     * @return true se o aluno foi adcionado
     */
    public boolean adcionar(Aluno aluno) {
        boolean retorno;
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            dao.adcionar(aluno);

            con.close();

            return true;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao adcionar Aluno!");
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }

            return false;
        }
    }

    /**
     * Obtem um aluno da base de dados pelo numero de sua matricula.
     * @param matricula
     * @return
     */
    public Aluno obter(int matricula) {

        Aluno aluno = null;
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            aluno = dao.obter(matricula);

            con.close();

            return aluno;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao obter Aluno!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }

            return null;
        }
    }

    public List<Aluno> listar() {

        List<Aluno> alunos = null;
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            alunos = dao.listar();

            con.close();

            return alunos;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao lsitar Alunos!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }

            return null;
        }
    }

    public List<Aluno> listarPorNome(String nome) {

        List<Aluno> alunos = null;
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            alunos = dao.listarPorNome(nome);

            con.close();

            return alunos;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao listar Alunos por nome!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }

            return null;
        }
    }






    /**
     * Atualiza os dados de um aluno na base de dados SEM alterar seus telefones.
     * Para alterar os telefones utilizar os metodos correspondentes.
     * @param aluno aluno a ser adcionado
     * @return true se o aluno foi adcionado
     */
    public boolean atualizar(Aluno aluno) {
        boolean retorno;
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            retorno = dao.atualizar(aluno);

            con.close();

            return retorno;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao atualizar Aluno!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }

            return false;
        }
    }




    public boolean remover(int matricula) {
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            dao.remover(matricula);

            con.close();

            return true;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao remover Aluno!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }
            return false;
        }
    }


    
    public boolean adcionarTelefone(Aluno a, String numero) {
        return adcionarTelefone(a.getMatricula(), numero);
    }


    /**
     * Adciona um numero de telefone ao aluno de matricula correspondente.
     * @param matricula
     * @param numero numero de telefone
     * @return true se o telefone foi adcionado
     */
    public boolean adcionarTelefone(int matricula, String numero) {
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            dao.adcionarTelefone(matricula, numero);

            con.close();

            return true;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao adcionar telefone!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }
            return false;
        }
    }



    /**
     * Altera um numero de telefone
     * @param matricula Matricula do aluno a alterar o telefone
     * @return true se o telefone foi alterado
     */
    public boolean alterarTelefone(int matricula, String numeroAntigo, String numeroNovo) {
        boolean retorno;
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            dao.alterarTelefone(matricula, numeroAntigo, numeroNovo);

            con.close();

            return true;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao alterar telfone!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }

            return false;
        }
    }

    /**
     * Altera um numero de telefone. Atualiza o numero na classe de modelo
     * @param aluno Aluno a alterar o telefone
     * @return true se o telefone foi alterado
     */
    public boolean alterarTelefone(Aluno aluno, String numeroAntigo, String numeroNovo) {
        boolean result = alterarTelefone(aluno.getMatricula(), numeroAntigo, numeroNovo);

        if(result) {
            for(String tel : aluno.getTelefones()) {
                if(tel.equals(numeroAntigo)) {
                    aluno.getTelefones().remove(tel);
                    aluno.getTelefones().add(numeroNovo);
                }
            }
        }

        return result;
    }




        /**
     * Altera um numero de telefone
     * @param matricula Matricula do aluno a alterar o telefone
     * @return true se o telefone foi alterado
     */
    public boolean removerTelefone(int matricula, String numero) {
        boolean retorno;
        try {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getAlunoDAO(con);

            dao.removerTelefone(matricula, numero);

            con.close();

            return true;
        } catch (SQLException ex) {
            Mensagem.msgErro("Erro ao alterar telfone!\n" + ex.getMessage());
            logger.warning(ex.getMessage());
            try {
                con.close();
            } catch (SQLException ex1) {
            }

            return false;
        }
    }

    /**
     * Remove um numero de telefone. Atualiza os telefones da instancia de Aluno
     * @param aluno Aluno a alterar o telefone
     * @return true se o telefone foi alterado
     */
    public boolean removerTelefone(Aluno aluno, String numero) {
        boolean result = removerTelefone(aluno.getMatricula(), numero);

        if(result) {
            for(String tel : aluno.getTelefones()) {
                if(tel.equals(numero)) {
                    aluno.getTelefones().remove(tel);
                }
            }
        }

        return result;
    }


}
